#ifndef __HASHMAP_H__
#define __HASHMAP_H__

#include <string>
using ElementType = std::string;

class HashMap
{
public:
    // 构造
    HashMap(int Size);
    // 析构
    ~HashMap();
    
    // 插入（键值对）
    void Insert(const std::string &key, const ElementType &element);
    // 查（根据key找value）
    ElementType *Get(const std::string &key);
    // 重载 []
    ElementType &operator[](const std::string &key);
    // 删除（根据键值删除节点）
    void Remove(const std::string &key);

    // show
    void show();
    // 根据分组来打印（只打印值）
    void showByGroup();
private:
    // 哈希表的本质其实就是由多个节点构成的一个数组
    // 根据键找下标，然后根据下标就能找到节点
    struct Node // 节点
    {
        // 节点构造函数
        Node(const std::string &key, const ElementType &element)
        {
            this->key = key;
            this->value = element;
        }
        std::string key; // 键
        ElementType value; // 值
        Node *next; // 指向同下标的下一个节点的指针
    };

    Node **array; // 结构体指针的数组
    const int size;

    // 哈希函数：将字符串转成int的方法
    int Hash(const std::string &key);
};


#endif